package Capa_Modelo;


import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Persistence;
import javax.persistence.Query;

import Capa_Datos.CD_Curso;
import Capa_Datos.CD_Detallegs;
import Capa_Datos.CD_Grupo;
import Capa_Datos.CD_Horario;
import Capa_Datos.CD_Laboratorio;
import Capa_Datos.CD_Profesor;
import Capa_Datos.CD_RegInstalacion;
import Capa_Datos.CD_Software;
import Capa_Datos.CD_Solicitud;

public class CM_ImplSolicitudDAO extends CM_BaseDao implements CM_SolicitudDAO{

	public CM_ImplSolicitudDAO(){
		super();
	}


	@Override
	public int registrarSol(CD_Software software,CD_Curso curso,String idProfesor,String DatosAd,Date fecha,String estado) {
		int indice=1;
		CD_Solicitud solicitud=null;
	
		
		List<CD_Grupo> listGrupo=new ArrayList<CD_Grupo>();
		listGrupo=buscarGrupo(curso, idProfesor);

		CD_Software sw=null;
		sw=buscarSW(software);
		if(sw!=null) solicitud=crearSoliRepo(sw, DatosAd, fecha, estado);
		else	solicitud=crearSoli(software, DatosAd, fecha, estado);
	
	
		for(int i=0;i<listGrupo.size();i++){
			indice=crearDetalle(listGrupo.get(i), solicitud);
			if(indice==0) break;
		}
	
		
		return indice;
	}
	
	
	public int crearDetalle(CD_Grupo grupo,CD_Solicitud solicitud){
		int indice=1;
		CD_Detallegs gs=new CD_Detallegs();
		gs.setGrupo(grupo);
		gs.setSolicitud(solicitud);
		 try{     
				
				em.getTransaction().begin();
			    em.persist(gs);
			    em.flush();
		        em.getTransaction().commit();
		
			}catch(Exception e){
				System.out.print("*No detalle*"+ e.getLocalizedMessage());	
				indice=0;
			}
		return indice;
	}
	
	public CD_Solicitud crearSoliRepo(CD_Software software,String DatosAd,Date fecha,String estado){
		int indice=1;
		CD_Solicitud solicitud=new CD_Solicitud();
		solicitud.setSoftware(software);
		solicitud.setNomsw(software.getNombre());
		solicitud.setVersionsw(software.getVersion());
		solicitud.setFecha_solicitud(new Date());
		solicitud.setFecha_requerimiento(fecha);
		solicitud.setDescripcion(DatosAd);
		solicitud.setEstado(estado);
		indice=newSoli(solicitud);
		if(indice==1) return solicitud;
		else return null;
	}
	
	
	public CD_Solicitud crearSoli(CD_Software software,String DatosAd,Date fecha,String estado){
		int indice=1;
		CD_Solicitud solicitud=new CD_Solicitud();
		solicitud.setNomsw(software.getNombre());
		solicitud.setVersionsw(software.getVersion());
		solicitud.setFecha_solicitud(new Date());
		solicitud.setFecha_requerimiento(fecha);
		solicitud.setDescripcion(DatosAd);
		solicitud.setEstado(estado);
		indice=newSoli(solicitud);
		if(indice==1) return solicitud;
		else {
			System.out.print("Entro a no repo"+ software.getNombre());
			return null;
		}
	}
	
	public int newSoli(CD_Solicitud solicitud){
	       int indice=1;
			 try{     
					
					em.getTransaction().begin();
				    em.persist(solicitud);
				    em.flush();
			        em.getTransaction().commit();
			
				}catch(Exception e){
					System.out.print("*No soli*"+ solicitud.getIdSolicitud()+e.getMessage());	
					indice=0;
				}
			
		        
			return indice;
		}
	
	public CD_Software buscarSW(CD_Software software){
       CD_Software sw=null;
		try{     
			
			em.getTransaction().begin();
		Query q=em.createQuery("SELECT s FROM CD_Software s WHERE s.nombre=:nombre AND s.version=:version");
		q.setParameter("nombre",software.getNombre());
		q.setParameter("version",software.getVersion());
	    sw=(CD_Software) q.getSingleResult();
	          em.flush();
	          em.getTransaction().commit();
	
		}catch(Exception e){
			System.out.print("No existe"+ software.getNombre()+e.getLocalizedMessage());	
			em.getTransaction().rollback();
		}
        return sw;
	}
	
	

	
	

	
	public List<CD_Grupo> buscarGrupo(CD_Curso curso,String idProfesor){
		List<CD_Grupo> listGrupo=new ArrayList<CD_Grupo>();
		CD_Profesor prof=null;
		prof=obtenerProf(idProfesor);
		curso=obtenerCurso(curso);
		 try{     
				
		em.getTransaction().begin();
		Query q=em.createQuery("SELECT g FROM CD_Grupo g WHERE g.curso=:curso AND g.profesor=:profesor");
		q.setParameter("curso",curso);
		q.setParameter("profesor",prof);
		listGrupo=q.getResultList();;
		em.getTransaction().commit();
				
		}catch(Exception e){
		System.out.print("No existe"+ e.getCause());	
						
		}
		return listGrupo;
	}
	
	@Override	
	public List<CD_Horario> buscarHorario(CD_Curso curso,String idProfesor){
		List<CD_Horario> listHorario=new ArrayList<CD_Horario>();
		CD_Profesor prof=null;
		prof=obtenerProf(idProfesor);
		curso=obtenerCurso(curso);
		 try{     
				
		em.getTransaction().begin();
		Query q=em.createQuery("SELECT h FROM CD_Horario h WHERE h.grupo.curso=:curso AND h.grupo.profesor=:profesor");
		q.setParameter("curso",curso);
		q.setParameter("profesor",prof);
		listHorario=q.getResultList();;
		em.getTransaction().commit();
				
		}catch(Exception e){
		System.out.print("No existe"+ e.getLocalizedMessage());	
						
		}
		return listHorario;
	}
	
	
	
	
	public CD_Profesor obtenerProf(String idProfesor){
		CD_Profesor prof=null;
		prof=em.find(CD_Profesor.class,idProfesor);
		if(prof==null) System.out.print("Error");
		
		return prof;
		
	}
	
	public CD_Curso obtenerCurso(CD_Curso curso){
		try {
			  em.getTransaction().begin();
				Query q=em.createQuery("SELECT c FROM CD_Curso c WHERE c.nombre=:nombre");
				q.setParameter("nombre",curso.getNombre());
			    curso= (CD_Curso) q.getSingleResult();
			    em.getTransaction().commit();
			}catch (Exception e) {
				System.out.print("Error software" + e.getCause());
			}
		
		return curso;
		
	}


	@Override
	public List<String> buscarCurso(String id) {
		List<String> lista_curso=new ArrayList<String>();
		try{     
			
		    em.getTransaction().begin();
			Query q=em.createQuery("SELECT g.curso.nombre FROM CD_Grupo g WHERE g.profesor.idProfesor=:codigo GROUP BY g.curso.nombre");
			q.setParameter("codigo",id);
		    lista_curso=q.getResultList();
		    em.getTransaction().commit();
		
			}catch(Exception e){
				System.out.print("No existe--->"+ e.getLocalizedMessage());	
				
			}
	        
	        return lista_curso;
		
	}

	
	

	@Override
	public List<CD_Detallegs> buscarDetalleGS(String idProfesor) {

		List<CD_Detallegs> lista_detalle=new ArrayList<CD_Detallegs>();
		try{     
			
		    em.getTransaction().begin();
			Query q=em.createQuery("SELECT g FROM CD_Detallegs g WHERE g.grupo.profesor.idProfesor=:codigo GROUP BY g.solicitud.idSolicitud");
			q.setParameter("codigo",idProfesor);
			lista_detalle=q.getResultList();
		    em.getTransaction().commit();
		
			}catch(Exception e){
				System.out.print("No existe--->"+ e.getLocalizedMessage());	
				
			}
	        
		
		return lista_detalle;
	}

	
	@Override
	public List<CD_Detallegs> buscarGeneralDetalleGS() {

		List<CD_Detallegs> lista_detalle=new ArrayList<CD_Detallegs>();
		try{     
			
		    em.getTransaction().begin();
			Query q=em.createQuery("SELECT g FROM CD_Detallegs g   GROUP BY g.solicitud.idSolicitud");
			lista_detalle=q.getResultList();
		    em.getTransaction().commit();
		
			}catch(Exception e){
				System.out.print("No existe--->"+ e.getLocalizedMessage());	
				
			}
	        
		
		return lista_detalle;
	}


	@Override
	public int eliminarDetalleGS(CD_Detallegs detalle) {
		int indice=1;
		CD_Solicitud sl=null;
		sl=detalle.getSolicitud();
		try{  	
			em.getTransaction().begin();
			Query q=em.createQuery("DELETE FROM CD_Detallegs d WHERE d.solicitud.idSolicitud=:idSolicitud");
			q.setParameter("idSolicitud",sl.getIdSolicitud());
			q.executeUpdate();
		    em.getTransaction().commit();
		}catch(Exception e){
			indice=0;
			System.out.print("Noooo actualizzaaa-->"+ e.getLocalizedMessage());
			
		}
		
		if(indice==1)eliminarSol(sl); 
			
		return indice;
	}
	
	public void eliminarSol(CD_Solicitud sl){
		try{  	
			em.getTransaction().begin();
			em.remove(sl);
		    em.getTransaction().commit();
		}catch(Exception e){
		
			System.out.print("Noooo actualizzaaa-->"+ e.getCause());
			
		}
	
		
	}
	
	
	@Override
	public int actualizarSolicitud(CD_Detallegs detalle) {
		
		detalle=findDet(detalle.getIdDetalleGS());
		
		int indice=1;
		try{  	
			em.getTransaction().begin();
			em.merge(detalle);
		    em.getTransaction().commit();
		}catch(Exception e){
			indice=0;
			System.out.print("Error-->"+ e.getLocalizedMessage());
			
		}
		
		return indice;
	}

	
	public CD_Detallegs findDet(int id){
		CD_Detallegs det=null;
		det=em.find(CD_Detallegs.class,id);
		if(det==null) System.out.print("Error");
		
		return det;
	}
}
